home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 24
/
Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso
/
Aminet
/
demo
/
mag
/
Infamia3.lha
/
infamia03
/
mv_code
/
copper
/
skip3.s
< prev
next >
Wrap
Text File
|
1996-07-24
|
7KB
|
256 lines
************************************
* /\/\ *
* / \ *
* / /\/\ \ O R B_I D *
* / / \ \ / / *
* / / __\ \ / / *
* ¯¯ \ \¯¯/ / I S I O N S *
* \ \/ / *
* \ / *
* \/ *
* Feel the DEATH inside! *
************************************
* Coded by: *
* The Dark Coder / Morbid Visions *
************************************
; commenti alla fine del sorgente
SECTION DK,code
incdir "Infamia:MV_code/"
include MVstartup.s ; Codice di startup: prende il
; controllo del sistema e chiama
; la routine START: ponendo
; A5=$DFF000
;5432109876543210
DMASET EQU %1000001010000000 ; copper,bitplane,blitter DMA
START:
move #DMASET,dmacon(a5)
move.l #COPPERLIST,cop1lc(a5)
move d0,copjmp1(a5)
move.l #copperloop,cop2lc(a5) ; carica l'indirizzo del loop
; in COP2LC
mouse:
bsr CambiaCopper
moveq #3-1,d7
WaitFrame
; notare il doppio controllo sulla sincronia
; necessario perche` la muovicopper richiede MENO di UNA rasterline su 68030
move.l #$1ff00,d1 ; bit per la selezione tramite AND
move.l #$13000,d2 ; linea da aspettare = $130, ossia 304
.Waity1
move.l vposr(a5),d0 ; vposr e vhposr
and.l d1,d0 ; seleziona solo i bit della pos. verticale
cmp.l d2,d0 ; aspetta la linea $130 (304)
bne.s .waity1
.Waity2
move.l vposr(a5),d0
and.l d1,d0
cmp.l d2,d0
beq.s .waity2
dbra d7,WaitFrame
btst #6,$bfe001 ; tasto sinistro del mouse premuto?
bne.s mouse ; se no, torna a mouse:
rts
****************************************************
* Questa routine muove la bandiera e cambia i colori
CambiaCopper:
move.b PosBandiera(pc),d0
tst.b PosFlag
beq.s Basso
subq.b #1,d0
cmp.b #$81,d0
bra.s Muovi ; le istruzioni Bcc non alterano i CC
Basso addq.b #1,d0
cmp.b #$bf,d0
Muovi
shs PosFlag ; testa limiti (entrambi! ;)
move.b d0,PosBandiera
lsl #8,d0
move.b #$07,d0
move d0,Inizio
add #$4000,d0
move d0,Fine
tst.b FadeFlag
beq.s FadeIn
FadeOut
sub #$010,verde+2 ; aumenta luminosita`
cmp #$080,verde+2
sne FadeFlag ; se siamo al minimo passa a FadeIn
sub #$111,bianco+2 ; aumenta luminosita`
sub #$100,rosso+2 ; aumenta luminosita`
rts
FadeIn
add #$010,verde+2 ; aumenta luminosita`
cmp #$0f0,verde+2 ; se siamo al massimo passa a FadeOut
seq FadeFlag
add #$111,bianco+2 ; aumenta luminosita`
add #$100,rosso+2 ; aumenta luminosita`
rts
* Posizione prima riga della bandiera
; La bandiera deve rimanere tra le righe $80 e $ff, quindi essendo alta
; $40, la posizione deve variare tra le righe $80 e $bf
PosBandiera dc.b $a0
PosFlag dc.b 0
FadeFlag dc.b 0
SECTION MY_COPPER,CODE_C
*************************************************************************
* Copper Macros by The Dark Coder / Morbid Visions
* vers. 3 SE / 16-07-96 / per ASM One 1.29
* questa e` una versione ridotta delle copper macros usate dai Morbid Visions
* realizzata appositamente per i sorgenti pubblicati su Infamia.
* La versione completa (integrata con le altre macros standard MV) ha
* controlli aggiuntivi sugli errori e permette di utilizzare il Blitter
* Finished Disable bit. Chi e` interessato puo` contattare The Dark Coder.
* formato
* CMOVE valore immediato, registro hardware destinazione
* WAIT Hpos,Vpos[,Hena,Vena]
* SKIP Hpos,Vpos[,Hena,Vena]
* CSTOP
* Nota: Hpos,Vpos coordinate copper, Hena, Vena sono i valori di maschera
* della posizione copper, opzionali (se non specificati viene assunto
* Hena=$fe e Vena=$7f)
cmove: macro
dc.w [\2&$1fe]
dc.w \1
endm
wait: macro
dc.w [\2<<8]+[\1&$fe]+1
ifeq narg-2
dc.w $fffe
endc
ifeq narg-4
dc.w $8000+[[\4&$7f]<<8]+[\3&$fe]
endc
endm
skip: macro
dc.w [\2<<8]+[\1&$fe]+1
ifeq narg-2
dc.w $fffe
endc
ifeq narg-4
dc.w $8000+[[\4&$7f]<<8]+[\3&$fe]+1
endc
endm
cstop: macro
dc.w $ffff
dc.w $fffe
endm
* inizia la copperlist
COPPERLIST:
; barra 1
cmove $111,color00
wait $7,$29
cmove $a0a,color00
wait $7,$2a
cmove $11f,color00
wait $7,$2b
cmove $000,color00
Inizio:
wait $7,$80
copperloop: ; da qui inizia il loop
verde: cmove $080,color00 ; colore verde. Il valore RGB da caricare nel
; registro si trova all'indirizzo "verde+2"
; perche` e` la seconda word dell'istruzione
; copper
wait $6b,$80,$fe,0 ; aspetta primo terzo di schermo
; (le y sono mascherate)
bianco: cmove $888,color00 ; bianco. Modificare a "bianco+2"
wait $a5,$80,$fe,0 ; aspetta secondo terzo di schermo
rosso: cmove $800,color00 ; rosso. Modificare a "rosso+2"
wait $e0,$80,$fe,0 ; aspetta la fine della riga
Fine:
skip 0,$c0,0,$7f ; SKIP alla linea $c0
; (le x sono mascherate)
cmove 0,copjmp2 ; scrive in COPJMP2 - salta ad inizio loop
cmove $000,color00
wait 220,255
; barra 2
wait $7,$14
cmove $11f,color00
wait $7,$15
cmove $a0a,color00
wait $7,$16
cmove $111,color00
cstop ; Fine della copperlist
end
Questo esempio mostra una notevole ottimizzazione ottenuta mediante l'uso
dei copperloop.
Abbiamo una bandiera che cambia colore e che si sposta in alto e in basso.
Per disegnare la bandiera si deve cambiare COLOR00 3 volte all'interno di una
riga di raster e ripetere gli stessi colori ad ogni riga. E` molto comodo usare
un copperloop. Le wait all'interno del loop hanno le posizioni verticali
mascherate, in modo da funzionare ad ogni riga di raster senza essere
modificate.
Per cambiare i colori, e` necessario modificare 3 sole istruzioni copper.
Inoltre per spostare verticalmente la bandiera basta modificare ogni volta la
posizione di attesa della WAIT che precede il loop e della SKIP che termina il
loop. In totale quindi abbiamo 5 sole modifiche da effettuare in memoria.
Se non usasassimo ne` il copperloop ne` le WAIT mascherate dovremmo modificare
ad ogni riga di raster, le 3 CMOVE (copper move) e le 3 WAIT per attendere le
varie posizioni. Poiche` la bandiera e` alta 64 righe, avremmo in totale
64*6=384 locazioni di memoria da modificare.
Come potete inoltre notare, e come anticipato nell'articolo su Infamia,
in questo sorgente vengono definite e utilizzate delle macro per definire le
istruzioni copper. In questo modo si ottengono (a mio avviso) dei sorgenti
piu` puliti e si riduce la probabilita` di commettere errori nella scrittura
delle copper list. Ad esempio confrontate la parte di copperlist che genera
la barretta colorata in alto in questo sorgente, con l'identico pezzo generato
con le DC.W negli esempi skip1.s e skip2.s. La versione in questo sorgente e`
immediatamente comprensibile anche ad una rapida occhiata ed e` molto piu`
elegante ed ordinata.